static void _show_trace(unsigned long sp, unsigned long __maybe_unused bp)
{
unsigned long *stack = (unsigned long *)sp, addr;
+ unsigned long *bottom = (unsigned long *)get_printable_stack_bottom(sp);
- while ( ((long)stack & (STACK_SIZE-BYTES_PER_LONG)) != 0 )
+ while ( stack <= bottom )
{
addr = *stack++;
if ( is_active_kernel_text(addr) )
/* Stack trace from frames in the stack, using frame pointers */
static void _show_trace(unsigned long sp, unsigned long bp)
{
- unsigned long *frame, next, addr, low, high;
+ unsigned long *frame, next, addr;
/* Bounds for range of valid frame pointer. */
- low = sp - 2*sizeof(unsigned long);
- high = (low & ~(STACK_SIZE - 1)) +
- (STACK_SIZE - sizeof(struct cpu_info) - 2*sizeof(unsigned long));
+ unsigned long low = sp, high = get_printable_stack_bottom(sp);
/* The initial frame pointer. */
next = bp;
#define get_stack_bottom() \
((unsigned long)&get_cpu_info()->guest_cpu_user_regs.es)
+/*
+ * Get the bottom-of-stack, as useful for printing stack traces. This is the
+ * highest word on the stack which might be part of a stack trace, and is the
+ * adjacent word to a struct cpu_info on the stack.
+ */
+#define get_printable_stack_bottom(sp) \
+ ((sp & (~(STACK_SIZE-1))) + \
+ (STACK_SIZE - sizeof(struct cpu_info) - sizeof(unsigned long)))
+
#define reset_stack_and_jump(__fn) \
__asm__ __volatile__ ( \
"mov %0,%%"__OP"sp; jmp %c1" \